package tw.rescue.biz;

import java.util.List;

import javax.servlet.http.Cookie;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;

import tw.rescue.dao.MessageBoardDao;
import tw.rescue.model.slim3.model.Account;
import tw.rescue.model.slim3.model.Category;
import tw.rescue.model.slim3.model.Message;
import tw.rescue.util.DatastoreUtil;

public class MessageBoardBiz {

	private MessageBoardDao<Key> messageBoardDao;
	private UserAccountBiz userAccountBiz;

	public void setMessageBoardDao(MessageBoardDao<Key> messageBoardDao) {
		this.messageBoardDao = messageBoardDao;
	}

	public void setUserAccountBiz(UserAccountBiz accountBiz) {
		this.userAccountBiz = accountBiz;
	}

	/**
	 * 檢查權限後張貼新留言，並視情況產生認證信
	 * @param user 帳號資料，若無認證 cookie 則為 null
	 * @param message
	 */
	public void newMessage(Account user, Message message) {
		// TODO 檢查權限
		// TODO 檢查是否需送出認證信
		messageBoardDao.newMessage(message);
	}

	/**
	 * 檢查權限後回覆留言，並視情況產生認證信
	 * @param user 帳號資料，若無認證 cookie 則為 null
	 * @param replyToKey
	 * @param message
	 */
	public void replyMessage(Account user, Object replyToKey, Message message) {
		// TODO 檢查權限
		// TODO 檢查是否需送出認證信
		Key rtKey = DatastoreUtil.getKey(replyToKey);
		messageBoardDao.replyMessage(rtKey, message);
	}

	/**
	 * 判斷留言是否可回覆，第三層留言不可回覆
	 * @param replyToKey
	 * @return
	 */
	public boolean isAllowReply(String replyToKey) {
		Key rtKey = DatastoreUtil.getKey(replyToKey);
		Key pKey = rtKey.getParent();
		if (pKey==null || pKey.getParent()==null)
			return true;
		return false;
	}

	/**
	 * 將 Key 轉成 web safe 字串
	 * @param key
	 * @return
	 */
	public String keyToString(Key key) {
		return KeyFactory.keyToString(key);
	}

	/**
	 * 檢查權限後以 key 取得留言
	 * @param user 帳號資料，若無認證 cookie 則為 null
	 * @param category
	 * @param key
	 * @return
	 */
	public Message getMessage(Account user, Category category, Object key) {
		return messageBoardDao.getMessage(DatastoreUtil.getKey(key));
	}

	/**
	 * 檢查權限後，取得某分類內依日期排序 DESC 排序之第 from 筆起共 count 筆留言資料
	 * @param user 帳號資料，若無認證 cookie 則為 null
	 * @param category
	 * @param from
	 * @param count
	 * @return
	 */
	public List<Message>getRecentMessages(Account user, Category category, Integer from, Integer count) {
		String ctg = category!=null ? category.getLabel() : null;
		return messageBoardDao.queryMessages(ctg, from, count);
	}

	/**
	 * 取得所有分類依日期排序 DESC 排序之第 from 筆起共 count 筆留言資料，若不是管理員，則範圍僅包含一般使用者可讀分類
	 * @param user 帳號資料，若無認證 cookie 則為 null
	 * @param from
	 * @param count
	 * @return
	 */
	public List<Message> getRecentMessages(Account user, Integer from, Integer count) {
		// TODO
		return null;
	}


	/**
	 * 針對留言發出認證信
	 * @param user
	 * @param message
	 */
	public void sendAuthenticationMail(Account user, Message message) {
		// TODO
	}

	/**
	 * 留言審核認證，若通過認證該留言將變為可見，使用者顯示之刊登時間為通過認證時間，原始提交時間不受影響
	 * @param user 帳號資料，若無認證 cookie 則為 null
	 * @param key 留言key
	 * @param authCode 認證碼
	 * @return 若該留言先前未認證且此次通過認證，回傳非null Cookie 值用於設定使用者瀏覽器，否則回傳 null
	 */
	public Cookie enablePendingMessaage(Account user, Object key, String authCode) {
		// TODO
		return null;
	}
}
